package com.lcke.system.service;

import cn.hutool.core.bean.BeanUtil;
import com.lcke.system.dao.MenuMapper;
import com.lcke.system.entity.SystemMenu;
import com.lcke.system.model.MenuResult;
import com.lcke.system.model.SystemUser;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;


@Service
public class MenuService {

    @Autowired
    private MenuMapper menuMapper;

    public MenuResult getUserMenus(SystemUser systemUser) {
        MenuResult menuResult = new MenuResult();
        List<SystemMenu> allMenu = menuMapper.getlist(systemUser.getPermissions());
        if (allMenu.size() > 0) {
            BeanUtil.copyProperties(allMenu.get(0), menuResult);
        }
        List<MenuResult> child = getChild(menuResult.getId(), allMenu);
        menuResult.setChild(child);

        return menuResult;
    }

    /**
     * 获取子节点
     *
     * @param id      父节点id
     * @param allMenu 所有菜单列表
     * @return 每个根节点下，所有子菜单列表
     */
    private List<MenuResult> getChild(Long id, List<SystemMenu> allMenu) {
        List<MenuResult> childList = new ArrayList<>();
        for (SystemMenu menu : allMenu) {
            MenuResult menuResult = BeanUtil.copyProperties(menu, MenuResult.class);
            if (menu.getParent().equals(id)) {
                // 遍历所有节点，将所有菜单的父id与传过来的根节点的id比较
                //相等说明：为该根节点的子节点。
                childList.add(menuResult);
            }
        }
        //递归 遍历每一层菜单
        for (MenuResult nav : childList) {
            nav.setChild(getChild(nav.getId(), allMenu));
        }
        //如果节点下没有子节点，返回一个空List（递归退出）
        if (childList.size() == 0) {
            return new ArrayList<>();
        }
        return childList;
    }

}
